perm filename DPYDEF.SAI[4,KMC] blob sn#180024 filedate 1975-10-04 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	REQUIRE "DPYSYS.HDR[1,PDQ]" SOURCE_FILE
C00004 00003	α XGP and DD character sizes are incompatible
C00006 00004	INTEGER PROC FLOOR(VALUE INTEGER X, SIZE)
C00008 00005	PROC TEXT(VALUE STRING STR VALUE INTEGER X, Y)
C00010 00006	PROC SHADEIN(VALUE INTEGER X, Y, SLOPE)
C00012 ENDMK
C⊗;
REQUIRE "DPYSYS.HDR[1,PDQ]" SOURCE_FILE;
REQUIRE "IODEFS.SAI[SEC,RCP]" SOURCE_FILE;

INTEGER ARRAY PLOTCOM[1:1000];

PROC CALCOMP(STRING FILE;INTEGER ARRAY BUFR);
α Outputs display buffer BUFR to disk file FILE in a format
readable by the Nealy Calcomp plotter program PLTVEC, and by
the Quam Video Synthesizer program MIRTOP;
IF FILE THEN
BEGIN	INTEGER DSIZ,CCCHN;
	OPEN(CCCHN←GETCHAN,"DSK",'14,0,1,0,0,0);
	ENTER(CCCHN,FILE&".GRF",0);
	DPYPARS;DSIZ←BUFR[2]+3;
	ARRYOUT(CCCHN,BUFR[1],DSIZ);
	RELEASE(CCCHN);
END "CALCOMP";

PROC DISPLAY(VALUE STRING PFILE);
	BEGIN
	OUTSTR("This display will last for a few seconds" ↓);
	IF PFILE THEN CALCOMP(PFILE, PLOTCOM);
	FOR I ← 1 TIL 2 DO DPYOUT(0);
	END;
α XGP and DD character sizes are incompatible;
INTEGER CHAR_SIZE, CHAR_X, CHAR_Y;

PROC CHAR_INIT(VALUE INTEGER SIZE);
	BEGIN
	CHAR_SIZE ← SIZE;
	DPYBIG(CHAR_SIZE);
	IF GET_A_STRING("For XGP [Y,N]") = "Y" THEN
		BEGIN
		CHAR_X ← CASE SIZE OF (0,  5,  9,  9, 18, 23, 36, 45);
		CHAR_Y ← CHAR_X + 2;
		END
	ELSE	BEGIN
		CHAR_X ← CASE SIZE OF (0, 10, 15, 17, 20, 30, 40, 60);
		CHAR_Y ← CHAR_X + 2;
		END;
	BLANKS ← "                              ";
	SETFORMAT(0,1);
	END;

α DD raster values;
INTEGER LEFT, BOTTOM, WIDTH, HEIGHT;

PROC SCREEN_INIT(VALUE INTEGER VCAPS, CAPS);
	BEGIN
	LEFT ← -500;
	BOTTOM ← -500;
	WIDTH ← 1000;
	HEIGHT ← 800;
	LEFT ← LEFT + VCAPS * CHAR_X;
	BOTTOM ← BOTTOM + CAPS * CHAR_Y;
	WIDTH ← WIDTH - VCAPS * CHAR_X;
	HEIGHT ← HEIGHT - CAPS * CHAR_Y;
	END;

α Arbitrary input values;
INTEGER MIN_X, MAX_X, MIN_Y, MAX_Y, X_DIF, Y_DIF;

INTEGER PROC DX_SCALE(VALUE INTEGER X);
	RETURN(X * WIDTH DIV X_DIF);
INTEGER PROC DY_SCALE(VALUE INTEGER Y);
	RETURN(Y * HEIGHT DIV Y_DIF);
INTEGER PROC X_SCALE(VALUE INTEGER X);
	RETURN(DX_SCALE(X - MIN_X) + LEFT);
INTEGER PROC Y_SCALE(VALUE INTEGER Y);
	RETURN(DY_SCALE(Y - MIN_Y) + BOTTOM);
INTEGER PROC FLOOR(VALUE INTEGER X, SIZE);
	RETURN((X + 180 * SIZE) DIV SIZE * SIZE - 180 * SIZE);

PROC X_AXIS;
	BEGIN
	INTEGER LINES, INTERVAL, NEXT_MARK;
	LINES ← BOTTOM - 2 * CHAR_Y;
	X_DIF ← MAX_X - MIN_X;
	INTERVAL ← X_DIF DIV 8;
	INTERVAL ← GET_AN_INT("X-AXIS INTERVAL - NEAR" ∂ CVS(INTERVAL));
	MIN_X ← FLOOR(MIN_X, INTERVAL);
	MAX_X ← -FLOOR(-MAX_X, INTERVAL);
	X_DIF ← MAX_X - MIN_X;
	NEXT_MARK ← MIN_X;
	WHILE NEXT_MARK ≤ MAX_X DO
		BEGIN
		AIVECT(X_SCALE(NEXT_MARK) - CHAR_X, LINES);
		DPYSST(CVS(NEXT_MARK));
		AIVECT(X_SCALE(NEXT_MARK), BOTTOM - CHAR_Y);
		RVECT(0, 2 * CHAR_Y);
		NEXT_MARK ← NEXT_MARK + INTERVAL;
		END;
	END;

PROC Y_AXIS;
	BEGIN
	INTEGER LINES, INTERVAL, NEXT_MARK;
	LINES ← LEFT - 4 * CHAR_X;
	Y_DIF ← MAX_Y - MIN_Y;
	INTERVAL ← Y_DIF DIV 8;
	INTERVAL ← GET_AN_INT("Y-AXIS INTERVAL - NEAR" ∂ CVS(INTERVAL));
	MIN_Y ← FLOOR(MIN_Y, INTERVAL);
	MAX_Y ← -FLOOR(-MAX_Y, INTERVAL);
	Y_DIF ← MAX_Y - MIN_Y;
	NEXT_MARK ← MIN_Y;
	WHILE NEXT_MARK ≤ MAX_Y DO
		BEGIN
		AIVECT(LINES, Y_SCALE(NEXT_MARK));
		DPYSST(CVS(NEXT_MARK));
		AIVECT(LEFT - CHAR_X, Y_SCALE(NEXT_MARK));
		RVECT(2 * CHAR_X, 0);
		NEXT_MARK ← NEXT_MARK + INTERVAL;
		END;
	END;
PROC TEXT(VALUE STRING STR; VALUE INTEGER X, Y);
	BEGIN
	AIVECT(X_SCALE(X), Y_SCALE(Y));
	DPYSST(STR);
	END;

PROC CAPTION(VALUE STRING STR; VALUE INTEGER FROM, TO, LINES);
	IF (FROM ← FROM MAX MIN_X) < (TO ← TO MIN MAX_X) THEN
	BEGIN
	AIVECT((X_SCALE(FROM) + X_SCALE(TO) - LN(STR) * CHAR_X) DIV 2,
		BOTTOM - LINES * CHAR_Y);
	DPYSST(STR);
	END;

PROC VERT_CAPTION(VALUE STRING STR; VALUE INTEGER LINES, FROM, TO);
	IF (FROM ← FROM MIN MAX_Y) > (TO ← TO MAX MIN_Y) THEN
	BEGIN
	LINES ← LEFT - LINES * CHAR_X;
	FROM ← (Y_SCALE(FROM) + Y_SCALE(TO) + LN(STR) * CHAR_Y) DIV 2;
	FOR I ← 1 TIL LN(STR) DO
		BEGIN
		AIVECT(LINES, FROM - I * CHAR_Y);
		DPYSST(STR[I FOR 1]);
		END;
	END;

PROC LINE(VALUE INTEGER X1, Y1, X2, Y2);
	BEGIN
	AIVECT(X_SCALE(X1), Y_SCALE(Y1));
	AVECT(X_SCALE(X2), Y_SCALE(Y2));
	END;

PROC STREET(VALUE INTEGER FX, FY, TX, TY, NX, NY; VALUE STRING ST);
	BEGIN
	LINE(FX, FY, TX, TY);
	TEXT(ST, NX, NY);
	END;
PROC SHADEIN(VALUE INTEGER X, Y, SLOPE);
	BEGIN
	INTEGER HALFX1, HALFX2, START;
	HALFX1 ← X DIV 2;
	HALFX2 ← X - HALFX1;
	RIVECT(HALFX1, 0);
	START ← (IF SLOPE = 1 THEN HALFX2 ELSE HALFX1) MIN Y;
	RVECT(SLOPE * START, START);
	RIVECT(- SLOPE * ((IF SLOPE = 1 THEN HALFX1 ELSE HALFX2) + START), -START);
	FOR START ← 0 STEP HALFX1 UNTIL  Y - X DO
		BEGIN
		RVECT(SLOPE * X, X);
		RIVECT(- SLOPE * X, -HALFX2);
		END;
	WHILE START < Y DO
		BEGIN
		INTEGER ¬hIS;
		THIS ← Y - START;
		RVECT(SLOPE * THIS, THIS);
		RIVECT(- SLOPE * THIS, HALFX1 - THIS);
		START ← START + HALFX1;
		END;
	END;

PROC BOX(VALUE INTEGER X, Y, DX, DY, SHADE);
	BEGIN
	AIVECT(X_SCALE(X), Y_SCALE(Y));
	DX ← DX_SCALE(DX MAX 1);
	DY ← DY_SCALE(DY MAX 1);
	RVECT(0, DY);
	RVECT(DX, 0);
	RVECT(0, - DY);
	RVECT(- DX, 0);
	IF SHADE = 1 OR SHADE = 3 THEN SHADEIN(DX, DY, 1);
	AIVECT(X_SCALE(X), Y_SCALE(Y));
	IF SHADE = 1 OR SHADE = 5 THEN SHADEIN(DX, DY, -1);
	END;